package controller;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/*
	 * FrontController 1. 모든 클라이언트 요청을 받는 앞단 컨트롤러 2. 컨트롤러들의 공통 로직을 처리하는 컨트롤러.
	 */

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Controller들 공통 사전 작업 --> 구현
		// ? 요청파라미터 한글처리, 요청파라미터 조회, 검증 ...(결정된건 없다)
		request.setCharacterEncoding("UTF-8");

		// 사용자가 요청한 작업을 처리하는 컨트롤러 로직 --> 호출
		String command = request.getParameter("command");

		Controller controller = HandleMapping.getController(command);

		try {
			AttributeAndView av = controller.handleRequest(request, response);
			// Controller들 공통 사후 작업 --> 구현
			// ? 응답처리, 처리결과 로그(기록)등등

			if (av.isRedirect()) {// 리다이렉트 방식으로 이동
				response.sendRedirect(av.getUrl());
			} else {// 요청 디스패치 방식으로 이동

				// request scope에 Attribute들 binding
				Map attributes = av.getAttributes();
				if (attributes != null && attributes.size() != 0) {
					Set<Entry<String, Object>> entry = attributes.entrySet();
					for(Entry<String,Object> e: entry) {
						request.setAttribute(e.getKey(), e.getValue());
					}
				}

				RequestDispatcher rdp = request.getRequestDispatcher(av
						.getUrl());
				rdp.forward(request, response);
			}

		} catch (Exception e) {
			e.printStackTrace();
			throw new ServletException(e);// 처리를 Container에게 맡긴다.
		}
	}

}
